
/**
 * \file BlocObjet.h
 * \brief Module pour gérer les cases, qu'on appelle ici blocs et plus exactement BlocObjet. Une case est un bloc qui peut contenir un objet.
 * \author Carrillon Sovanna
 * \version 1.0
 * \date mai 2011
 */


#ifndef BLOCOBJET_H
#define BLOCOBJET_H

#include <stdbool.h>


/**
  * \enum Bloc
  * \brief le contenu à priori immuable d'une case
  * bord, porte et portail ont aussi la propriété particulière de 'changeurs de zone'
  * tableau des associations bloc <-> caractère utilisé pour lire les fichiers :
  * '*' == mur
  * ' ' == dalle
  * '.' == herbe
  * '-' == touffe_herbe
  * '_' == fleur
  * '#' == bord
  * '%' == porte
  */
enum eBloc { mur, dalle, herbe, touffe_herbe, fleur1, bord, porte }; /* poursuivre avec pavés, terre, sable,... */
/** \typedef renommage de eBloc en Bloc */
typedef enum eBloc Bloc;


/**
  * \enum Objet
  * \brief le contenu susceptible de changer d'une case
  */
enum eObjet {aucun, coeur, mur_cassable, epee};
/** \typedef renommage de eObjet en Objet */
typedef enum eObjet Objet;


/**
  * \struct BlocObjet
  * \brief Correspond à une case dans une zone de jeu. Se compose d'un champ bloc qui représente le "sol" (ça peut aussi être un mur, un arbre...) et d'un champ objet qui peut être un coeur de vie ramassable par exemple ou un objet destructible
  */
struct sBlocObjet
    {
    	/** le contenu à priori immuable d'une case */
        Bloc bloc;
        /** le contenu susceptible de changer */
        Objet objet;
    };
/** \typedef renommage de sBlocObjet en BlocObjet */
typedef struct sBlocObjet BlocObjet;



/**
  * \brief Renvoie Vrai si le BlocObjet est accessible, Faux sinon
  * \param [in] p_BlocO : pointeur sur BlocObjet
  * \return Vrai ou Faux
  */
bool bloAccessible (const BlocObjet* p_BlocO);

/**
  * \brief Renvoie Vrai si le Bloc permet de changer de zone, Faux sinon
  * \param [in] bloc : un Bloc
  * \return Vrai ou Faux
  */
bool bloChangeurDeZone (Bloc bloc);


/**
  * \brief Remplit le champs bloc d'un BlocObjet en fonction d'un caractère passé en paramètre, le champs objet est mis à "aucun"
  * \param [in,out] p_BlocO : pointeur sur BlocObjet
  * \param [in] caractere : char
  */
void bloSetDepuisCaractere(BlocObjet* p_BlocO, char caractere);


/**
  * \brief Traduit un bloc en son caractère correspondant
  * \param [in] bloc : Bloc
  * \return Vrai ou Faux
  */
char bloCaractereDepuisBloc (Bloc bloc);



/**
  * \brief Renvoie le bloc d'un BlocObjet
  * \param [in] p_BlocO : pointeur sur BlocObjet
  * \return Bloc du BlocObjet
  */
Bloc bloGetBloc (const BlocObjet* p_BlocO);

/**
  * \brief Renvoie l'objet d'un BlocObjet
  * \param [in] p_BlocO : pointeur sur BlocObjet
  * \return Objet du BlocObjet
  */
Objet bloGetObjet (const BlocObjet* p_BlocO);


/**
  * \brief Affecte un objet au champ correspondant d'un BlocObjet
  * \param [in,out] p_BlocO : pointeur sur BlocObjet
  * \param [in] obj : Objet
  */
void bloSetObjet(BlocObjet* p_BlocO, Objet obj);


/**
  * \brief Lance le test de toutes les fonctions du module
  * \return Vrai si tout s'est bien passé
  */
bool bloTestRegression();

#endif /* BLOCOBJET_H */
